/*****************************************************************************
模块名  : CDlgBase
文件名  : CDlgBase.h
相关文件：
实现功能： widget基类   具有模态功能的widget部件
作者    ：
版本    ：
******************************************************************************/
#pragma once
#include <QtWidgets>
#include <qdialog.h>
#include <QtCore>
#include <QtGui>
#include <map> 
#include <string.h>

using namespace std;


typedef char			s8;
typedef unsigned char   u8;
typedef short           s16;
typedef unsigned short  u16;
typedef int				s32;
typedef unsigned long	ulong;

#ifdef _MSC_VER
    typedef __int64          s64;
    typedef unsigned __int64 u64;
#else
    typedef long long          s64;
    typedef unsigned long long u64;
#endif

//兼容32流的 u32 定义
#if defined(_WIN64) || defined(WIN64) ||defined (__LP64__) || defined (__64BIT__) || defined (_LP64) || (__WORDSIZE == 64)
    typedef unsigned int    u32;
#else
    typedef unsigned long   u32;
#endif


// 窗口显示模式
enum EDLGSHOWMODE
{
	EDLGSHOWMODE_INNER = 0,			// 内嵌，点击确定保存；
	EDLGSHOWMODE_POP,				// 弹出，点击确定不保存；
	EDLGSHOWMODE_POP_SAVE,			// 弹出，点击确定保存；
};

// UI控件信息
typedef struct tagUIInfo
{
	int	  nType;	    // 控件类型-EMCTRLTYPE
	void* pCtrlObj;		// 控件对象
	void* pValue;		// 控件关联的值
	tagUIInfo()
	{
		memset(this, 0, sizeof(tagUIInfo));
	}
}TUIInfo;

// ui控件类型
enum EMCTRLTYPE
{
	EMCTRLTYPE_NULL = 0,
	EMCTRLTYPE_PUSHBTN,
	EMCTRLTYPE_PUSHBTN_INT8,
	EMCTRLTYPE_PUSHBTN_FLOAT,
	EMCTRLTYPE_TOOLBTN,
	EMCTRLTYPE_SLIDER,
	//
	ECTRLTYPE_LBL_TXT,
	ECTRLTYPE_LBL_INT,
	ECTRLTYPE_LBL_INT8,
	ECTRLTYPE_LBL_INT16,
	ECTRLTYPE_LBL_FLOAT,
	//
	ECTRLTYPE_EDT_TXTUTF8,
	ECTRLTYPE_EDT_TXT,
	ECTRLTYPE_EDT_INT,
	ECTRLTYPE_EDT_INT8,
	ECTRLTYPE_EDT_INT16,
	ECTRLTYPE_EDT_FLOAT,
	ECTRLTYPE_EDT_FLOAT2,
    ECTRLTYPE_EDT_DOUBLE,

	//
	ECTRLTYPE_CMB,
	ECTRLTYPE_CMB_INT,
	ECTRLTYPE_CMB_INT8,
	ECTRLTYPE_CMB_INT16,
	ECTRLTYPE_CMB_TXT,
	//
	ECTRLTYPE_RADIO_INT,
	ECTRLTYPE_RADIO_INT8,
	ECTRLTYPE_RADIO_INT16,
	//
	ECTRLTYPE_CHECKBOX,
	//
	ECTRLTYPE_IPD_TEXT,
	ECTRLTYPE_IPD_INT,
	//
	ECTRLTYPE_TEXTBROWSER_TXT,
	//
	ECTRLTYPE_TXTEDT_TXT,
	//
	ECTRLTYPE_COUNT
};

//////////////////////////////////////////////////////////////////////////////////////////////////////////
class CWgtBase : public QWidget
{
	Q_OBJECT

public:
    CWgtBase(s8* szDlgName, s8* szTitle, u8* szParam, s32 nLen, QWidget* pWidParent);
	virtual ~CWgtBase();

public:
	bool			Init(void);
	bool			Release(void);
	bool			IsInit();

protected:
	//这是一个虚函数，继承自QEvent.只要重写了这个虚函数，当你按下窗口右上角的"×"时，就会调用你所重写的此函数.
	void			closeEvent(QCloseEvent* event);

protected:
	virtual void	InitData(void);
	// 对话框数据初始化
	virtual void	InitCtrl(void);
	// 设置样式，创建子控件/窗体，绑定数据与控件
	virtual void	InitEvt(void);

protected:
	virtual bool	UpdateDataFromUI(int nCtrlIndex = 0);// 通过数据更新UI
	virtual bool	UpdateUIFromData(u32 dwEvent = 0, int nCtrlIndex = 0);// 通过UI更新数据
private:
	bool			UpdateUIFromData(TUIInfo& tCtrl);	// 通过UI更新数据
	bool			UpdateDataFromUI(TUIInfo& tCtrl);	// 通过数据更新UI

	// 公共接口
public:
	bool			Set(s8* szType, string strIn);
	virtual bool    Set(s8* szType, string strIn, string& strOut);
	bool			Get(s8* szType, string& strOut);
	virtual bool    Get(s8* szType, string strIn, string& strOut);

public:
	bool			IsOk();
	bool			IsCancel();
	void			OnOk();
	void			OnCancel();
	void			exec();

protected:
Q_SIGNALS:
	void			quit();

protected:
	bool				m_bInit = false;
	string				m_strName;
	QString				m_strTitle;
	bool				m_bOk = false;

public:
    static string                   s_strLanguage;
    string                          m_strParam;  // 参数
    u8                              m_byShowMode = EDLGSHOWMODE_INNER;
    map<int, TUIInfo>               m_mapCtrl;

};

